package ihm;

import controller.AscenseurControleur;
import controller.DateControleur;
import controller.SimulationControleur;
import exception.FichierSimulationNonExistantException;
import exception.ImpossibleChargerFichierSimulationException;
import exception.PasDeFiChierSimulationException;
import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.*;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import util.Observeur;

/**
 * Classe qui affiche, dans la partie gauche de la fenêtre, le panel permettant le lancement d'une simulation.
 * 
 * @author Jason
 */
public class PanelInfos extends JPanel implements Observeur {

	private static final long serialVersionUID = 1L;
	
	private final String HEURE_COURANTE = "Heure courante : ";
	private final String LANCER_SIMULATION = "Lancer la simulation";
        private final String REINITIALISER_SIMULATION = "Réinitialiser la simulation";
	private final String ARRETER_SIMULATION = "Arrêter la simulation";

	private JLabel lblHeureCourante;
        private JLabel lblVitesseSimu;
	
	private JButton btnLancerSimulation;
        private JButton btnReinitialiserSimulation;
	private JButton btnArreterSimulation;
        
        private JSlider sliderVitesseSimu;
        
        private DateControleur dateControleur;
        private SimulationControleur simuControleur;
        private AscenseurControleur ascenseurControleur;
	
        /**
	 * Constructeur
	 * 
	 * @param couleurR	valeur RGB de la couleur rouge.
	 * @param couleurG	valeur RGB de la couleur verte.
	 * @param couleurB	valeur RGB de la couleur bleue.
         * @param dateControleur Controleur de la date
         * @param simuControleur Controleur de la simulation
	 */
	public PanelInfos(int couleurR, int couleurG, int couleurB, DateControleur dateControleur, 
                SimulationControleur simuControleur, AscenseurControleur ascenseurControleur) {
		
            this.setBackground(new Color(couleurR, couleurG, couleurB));

            this.dateControleur = dateControleur;
            this.simuControleur = simuControleur;
            this.ascenseurControleur = ascenseurControleur;
            
            lblVitesseSimu = new JLabel("Vitesse simu : 0%");
            sliderVitesseSimu = new JSlider(0, 1000, 0);
            lblHeureCourante = new JLabel(HEURE_COURANTE);
            btnLancerSimulation = new JButton(LANCER_SIMULATION);
            btnReinitialiserSimulation = new JButton(REINITIALISER_SIMULATION);
            btnArreterSimulation = new JButton(ARRETER_SIMULATION);

            this.definirLayout();
            this.ajouterEcouteursBoutons();

            dateControleur.ajouterObserveur(this);
            update();
	}
	
	/**
	 * Met en forme le panel.
	 */
	private void definirLayout() {
		GroupLayout layout = new GroupLayout(this);
		this.setLayout(layout);
		
		layout.setAutoCreateGaps(true);
		layout.setAutoCreateContainerGaps(true);
		
		layout.setHorizontalGroup(
			layout.createParallelGroup(GroupLayout.Alignment.CENTER)
                                        .addComponent(lblVitesseSimu)
                                        .addComponent(sliderVitesseSimu)
					.addComponent(lblHeureCourante)
				.addGroup(layout.createSequentialGroup()
					.addComponent(btnLancerSimulation)
					.addComponent(btnArreterSimulation)
				)
                                        .addComponent(btnReinitialiserSimulation)
		);
		
 		layout.setVerticalGroup(
            layout.createSequentialGroup()
                                        .addComponent(lblVitesseSimu)
                                        .addComponent(sliderVitesseSimu)
					.addComponent(lblHeureCourante)
				.addGroup(layout.createParallelGroup()
					.addComponent(btnLancerSimulation)
					.addComponent(btnArreterSimulation)
				)
                                        .addComponent(btnReinitialiserSimulation)
 		);
	}
        
        private void ajouterEcouteursBoutons() {
            btnLancerSimulation.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent ae) {
                    try {
                        if(!simuControleur.isSimuEnCours()) {
                            simuControleur.demarrer(ascenseurControleur,Math.abs(sliderVitesseSimu.getValue()-1000));
                            System.out.println("Début simulation");
                        } else {
                            JOptionPane.showMessageDialog(null, "La simulation tourne déjà", "Erreur", JOptionPane.ERROR_MESSAGE);
                        }
                    } catch (PasDeFiChierSimulationException ex) {
                        Logger.getLogger(PanelInfos.class.getName()).log(Level.SEVERE, null, ex);
                        JOptionPane.showMessageDialog(null, "Veuillez choisir un fichier de simulation", "Pas de fichier de simulation", JOptionPane.ERROR_MESSAGE);
                    } catch (FichierSimulationNonExistantException ex) {
                        Logger.getLogger(PanelInfos.class.getName()).log(Level.SEVERE, null, ex);
                        JOptionPane.showMessageDialog(null, "Le fichier que vous avez choisi n'existe pas", "Fichier non existant", JOptionPane.ERROR_MESSAGE);
                    } catch (ImpossibleChargerFichierSimulationException ex) {
                        Logger.getLogger(PanelInfos.class.getName()).log(Level.SEVERE, null, ex);
                        JOptionPane.showMessageDialog(null, "Impossible de charger le fichier de simulation pour une raison inconnue - Vérifier que ce dernier est accessible en lecture", "Erreur inconnue", JOptionPane.ERROR_MESSAGE);
                    }
                }
            });
            
            btnArreterSimulation.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent ae) {
                    if(simuControleur.isSimuEnCours()) {
                        simuControleur.arreter();
                        System.out.println("Fin simulation");
                    }
                }
            });
            
            sliderVitesseSimu.addChangeListener(new ChangeListener() {
                @Override
                public void stateChanged(ChangeEvent e) {
                    lblVitesseSimu.setText("Vitesse simu : " + String.valueOf(Math.abs(sliderVitesseSimu.getValue()/10))+"%");
                }
            });
            
            btnReinitialiserSimulation.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    simuControleur.reinitialiser();
                    PanelTraceExecution.resetTraceExecution();
                }
            });
        }

    @Override
    public void update() {
        lblHeureCourante.setText(HEURE_COURANTE + dateControleur);
    }
}
